

%{

#include <ast.h>
#include "parser.hpp"
int yyerror(char *s);
%}

%option noyywrap

digit       [0-9]
letters     [a-zA-Z]
letters_us  [_a-zA-Z]

identifier  {letters_us}+({letters_us}|{digit})*
int_const   {digit}+
float_const {digit}*\.{digit}+



%%

";"   { yylval.lexVal.line = yylineno; return ';'; }
"="   { yylval.lexVal.line = yylineno; return '='; }

"("   { yylval.lexVal.line = yylineno; return '('; }
")"   { yylval.lexVal.line = yylineno; return ')'; }
"["   { yylval.lexVal.line = yylineno; return '['; }
"]"   { yylval.lexVal.line = yylineno; return ']'; }
"{"   { yylval.lexVal.line = yylineno; return '{'; }
"}"   { yylval.lexVal.line = yylineno; return '}'; }
"."   { yylval.lexVal.line = yylineno; return '.'; }
","   { yylval.lexVal.line = yylineno; return ','; }

"+"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '+'; }
"-"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '-'; }
"*"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '*'; }
"/"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '/'; }
"%"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '%'; }

"<"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '<'; }
">"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '>'; }
"<="   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return OP_LE; }
">="   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return OP_GE; }
"=="   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return OP_EQ; }
"!="   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return OP_NE; }
"&&"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return OP_AND; }
"||"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return OP_OR; }
"!"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '!'; }
":"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return ':'; }
"?"   { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return '?'; }

"if"  { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return IF; }
"else"  { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return ELSE; }
"do"  { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return DO; }
"while"  { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return WHILE; }
"for"  { yylval.lexVal.line = yylineno; yylval.lexVal.text = new std::string (yytext); return FOR; }

{identifier}  { yylval.lexVal.text = new std::string(yytext);
               yylval.lexVal.line = yylineno;
               return IDENTIFIER;
               }
{int_const}   { yylval.lexVal.text = new std::string(yytext);
               yylval.lexVal.line = yylineno;
               return CONST;
               }
{float_const} { yylval.lexVal.text = new std::string(yytext);
               yylval.lexVal.line = yylineno;
               return CONST;
               }

[ \t]*		{}
[\n]		{ yylineno++;	}

.		{ std::cerr << "SCANNER "; yyerror(""); exit(1);	}



